package com.itheima.tlias.aop;

import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.AfterThrowing;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;

/**
 * @author
 * @version 1.0.1
 * @date 2023-04-13 10:23:05
 */
//@Component
//@Aspect
@Slf4j
////切面类的执行顺序（前置通知：数字越小先执行; 后置通知：数字越小越后执行）
//@Order(8)
public class MyAspect2 {
    //切点
    @Pointcut("execution(* com.itheima.tlias.service.impl.*.add(..))")
    public void pt(){}
//2、前置通知
//在方法开始前执行
    @Before("pt()")
    public void beforeMethod() {
        log.warn("方法开始执行了--->");
    }

//3、后置通知
//在方法执行后执行，无论方法是否正常执行，都会执行
    @After("pt()")
    public void afterMethod() {
        log.warn("方法执行结束了--->");
    }

//4、返回通知
//在方法正常结束后执行
    @AfterReturning(value = "pt()", returning = "obj")
    public Object afterReturningMethod(Object obj) {
        log.warn("方法正常执行结束了，返回值为：{}" + obj);
        return obj;
    }

//5、异常通知
//在方法出异常时执行
    @AfterThrowing(value = "pt()", throwing = "ex")
    public void afterThrowingMethod(Exception ex) {
        log.warn("方法出异常执行了，异常信息为：{}", ex);
    }
}
